package com.payment.notify.receive.service;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import com.payment.common.dto.notify.NotifyDto;
import com.payment.common.enums.notify.NotifyTypeEnum;
import com.payment.common.exceptions.ServiceException;
import com.payment.notify.receive.service.handler.NotifyReceiveHandler;
import com.payment.notify.receive.service.handler.impl.NotifyReceiveDefaultHandler;

/**
 * 类名：NotifyReceiveContext.java<br>
 * 描述：消息接收公共的上下文<br>
 * 创建者：XINJF<br>
 * 创建日期：2017年11月30日 上午11:11:53<br>
 * 版本：1.0<br>
 * 修改者：<br>
 * 修改日期：<br>
 */
public class NotifyReceiveContext {
	
	private NotifyReceiveStrategy strategy;
	
 	public NotifyReceiveContext(NotifyDto parameterDto) throws ServiceException {
 		NotifyReceiveHandler handler = this.initializeMessageReqHandler();
		this.strategy = handler.doRequest(parameterDto);
	}
 	
	public Object execute(){
		return this.strategy.executeNotifyReceive(this);
	}
	
	/**
	 * 功能描述：使用代理获取对象<br>
	 * 创建者：XINJF<br>
	 * 创建日期：2017年12月5日 下午5:50:04<br>
	 * 版本：1.0<br>
	 * 修改者：<br>
	 * 修改日期：<br>
	 */
	public NotifyReceiveHandler initializeMessageReqHandler() {
		final Object handler = new NotifyReceiveDefaultHandler(); //暂定为默认,如果有多个可以定自定义多个动态获取
		return (NotifyReceiveHandler) Proxy.newProxyInstance(getClass().getClassLoader(),NotifyReceiveDefaultHandler.class.getInterfaces(),new InvocationHandler(){
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				return method.invoke(handler, args);
			}
		});
	}
}
